/*
	1.转换函数，用于将类类型转换为某种类型（比如整型）
	2.而构造函数可以将某种类型转换为类类型。	这两个函数的作用是相反的。
	3.转换函数是用户定义的强制转换类型，可以像使用强制转换类型那样使用它们
*/
#include <iostream>
using namespace std;

class Stonewt     
{
private:
	enum{Lbs_per_stn=14};  //一磅等于14石，磅和石都是一种重量单位
	int stone;  //石
	double pds_left;   //不够1石的部分
	double pounds;    // 磅  
	
public:
	//构造函数，这个构造函数只接受一个参数，可以作为转换函数，和通常的转换函数不一样，或者说叫转换构造函数更换好
	Stonewt(double lbs){
		cout << "构造函数 Stonewt(double lbs) 被调用了" << endl;
	}   
	Stonewt(){}
};

Stonewt swap(){
	// 如果x是double类型的，那么将会先先转换为一个临时的Stonewt变量，然后赋值给接受返回值的对象。
	return 20.3;
}

void test1(){
	/*
	Stonewt(double llbs)是构造函数，
	这个构造函数只接受一个参数，可以作为转换函数，和通常的转换函数不一样，这里实现的是从普通类型到类类型的转换。
	在下列情况下被调用：
	*/
	Stonewt st1(20.3); //这将创建一个对象，并将其成员初始化
	
	Stonewt st2;   
	st2 = 20.3;    // 调用构造函数：double -> Stonewt
	
	swap(); // 返回值被声明为Stonewt的时候
}


class complex
{
public:
	complex (double r=0, double i=0);
	
	complex (const complex& a);
	
	friend const complex operator + (const complex& c1, const complex& c2);
	
private:
	double real, imag;
};

complex::complex (double r, double i) {
	real = r; 
	imag = i;
	cout<< "constructor:" << real << "," << imag << endl; 
}

complex::complex (const complex& a)
{
	real=a.real; 
	imag=a.imag;
	cout<<"copy constructor:"<<real<<","<<imag<<endl; 
}

const complex operator+(const complex& c1, const complex& c2) {
	double r = c1.real + c2.real;
	double i = c1.imag + c2.imag;
	return complex(r, i); //
}

void test2(){
	complex c, c1(3.5, 5.5);
	c=c1+1.5; // ok: c=operator +(c1, complex(1.5));
}

int main(){
	test1();
	cout << "======================" << endl;
	
	test2();
	
	return 0;
}